//////////////////////////////////////////////////////////////////////////////////
//
// ActionScript 3.0 Common Code Library (MIT License)
// Copyright (c) 2009 AS3CommonCode | Tony Birleffi | http://www.mosaiceye.com
// 
// Permission is hereby granted, free of charge, to any person
// obtaining a copy of this software and associated documentation
// files (the "Software"), to deal in the Software without
// restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following
// conditions:
// 
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
// 
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
// OTHER DEALINGS IN THE SOFTWARE.
//
// The following people are credited with originating all or parts of this code:
// FlashDoctors | flashdoctors.sourceforge.net
//
//////////////////////////////////////////////////////////////////////////////////

package org.as3commoncode.collections
{
	import org.as3commoncode.collections.ListIterator;
	import org.as3commoncode.collections.AbstractCollection;
	import org.as3commoncode.collections.IList;
	import org.as3commoncode.collections.IIterator;
	
	/**
	 * An array list class.
	 * 
	 * @see	org.as3commoncode.collections.AbstractCollection;
	 * @see org.as3commoncode.collections.IList;
	 * 
	 * @author Tony Birleffi
	 */
	public class ArrayList extends AbstractCollection implements IList
	{
		/**
		 * Add from an array.
		 * 
		 * @param a		Array.
		 */
		public function addFromArray(a:Array):void 
		{
			var i:uint = 0;
			var s:uint = a.length;
			for(i = 0; i < s; i++){
				this.addItem(a[i]);
			}
		}
		
		/**
		 * Create the sublist.
		 * 
		 * @param start		uint.
		 * @param end		uint.
		 * @return	IList.
		 */
		public function subList(start:uint, end:uint):IList 
		{
			var l:ArrayList = new ArrayList();
			var i:uint = 0;
			for(i = start; i < end; i++){
				l.addItem(this.getItemAt(i));
			}
			return l;
		}
		
		/**
		 * The index of the object passes.
		 * 
		 * @param obj	Object.
		 * @return int.
		 */
		public function indexOf(obj:Object):int 
		{
			return this.findIndex(obj);
		}
		
		/**
		 * The last index of the object.
		 * 
		 * @param obj	Object.
		 * @return int.
		 */
		public function lastIndexOf(obj:Object):int 
		{
			var i:uint;
			var idx:int = -1;
			var s:Number = this.size();
			for(i = 0; i < s; i++){
				if(this.getItemAt(i) == obj){
					idx = i;
				}
			}
			return idx;
		}
		
		/**
		 * Get the item at.
		 * 
		 * @param idx	uint.
		 * @return Object.
		 */
		public function getItemAt(idx:uint):Object
		{
			return this.arr[idx];
		}
		
		/**
		 * Set the item at.
		 * 
		 * @param idx	uint.
		 * @param obj	Object.
		 */
		public function setItemAt(idx:uint, obj:Object):void
		{
			this.arr[idx] = obj;
		}
		
		/**
		 * The iterator.
		 * 
		 * @return IIterator;
		 */
		override public function iterator():IIterator
		{
			return new ListIterator(this);
		}
		
		/**
		 * Clone the list.
		 * 
		 * @return IList.
		 */
		public function clone():IList 
		{
			return this.subList(0, this.size());
		}
	}
}